package com.spring.mvc.config;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;

/**
 * 定义数据源的AOP切面，通过该Service的方法名判断是应该走读库还是写库
 *
 * @author roger
 * @email 190642964@qq.com
 * @create 2018-02-01 11:17
 **/
public class DataSourceAspect {
    /**
     * 走从库的方法名
     */
    private static final String[] slave_method = {"query", "find", "get"};

    /**
     * 在进入Service方法之前执行
     *
     * @param point 切面对象
     */
    public void before(JoinPoint point) {
        // 获取到当前执行的方法名
        String methodName = point.getSignature().getName();
        // 判断是否为读库
        boolean isSlave = isSlave(methodName);
        if (isSlave) {
            // 标记为读库
            DynamicDataSourceHolder.markSlave();
        } else {
            // 标记为写库
            DynamicDataSourceHolder.markMaster();
        }
    }

    /**
     * 判断是否为读库
     *
     * @param methodName 方法名
     * @return 从库 - true , 主库 - false
     */
    private boolean isSlave(String methodName) {
        return StringUtils.startsWithAny(methodName, slave_method);
    }
}
